マルチアカウントのVPCエンドポイント(インターフェイス型)を1つに集約させる
やりたいこと
コスト削減のため、 マルチアカウントのVPCエンドポイントの集約 を行う構成を考えます。
各ユーザー User
VPC内インスタンス(AWSリソース)が
共有サービス Shared Service
のVPCエンドポイント(PrivateLink)を利用できるようにします。
前提条件としては以下のとおりです。
- 「複数のユーザー(User)VPC」と「共通サービス(Shared Service)VPC」がTGWにより IP到達可能な状態
※上図は Transit Gateway(TGW) によって通信可能な状態を想定したものですが、 ここの部分は VPCピアリング に置き換えてもらっても大丈夫です。
手順概要
今回は User Account#1
のみ、検証で確かめます。
User Account#1
と Shared Service Account
のお互い VPCが通信可能な状態です。
大まかな流れは以下のとおりです。
- VPCエンドポイントの作成
- プライベートホストゾーンとエイリアスレコードの作成
- プライベートホストゾーンの関連付け
例として Systems Manager 関連の VPCエンドポイントを実際に作成、関連付けまで行ってみます。
手順1. VPCエンドポイントの作成
VPCエンドポイントを作成します。 作成の際の設定として [プライベート DNS名を有効にする] のチェックを外して 作成しましょう。
CloudFormation テンプレートで作成する場合は以下のように PrivateDnsEnabled: false
を入れましょう。
SomeEndpoint: Type: AWS::EC2::VPCEndpoint Properties: PrivateDnsEnabled: false ︙
VPCエンドポイントのセキュリティグループには、 接続元のIPアドレス(or CIDR)もしくはセキュリティグループからの HTTPS(ポート443)を許可するルールを入れておきます。
作成が完了したら
DNS名 vpce-01234567abcdefg.xxxxxx.ap-northeast-1.vpce.amazonaws.com
をメモしておきましょう。
手順2. プライベートホストゾーンとエイリアスレコードの作成
プライベートホストゾーンを作成します。
以下、 ssmmessages
エンドポイントの例です。
- ドメイン名:
ssmmessages.ap-northeast-1.amazonaws.com
- コメント: (任意)
- タイプ: Amazon VPCのプライベートホストゾーン
- VPC ID: VPCエンドポイントを作成した VPC ID
作成したホストゾーンに エイリアスレコード を作成します。
- 名前: (空白)
- タイプ/エイリアス: A/はい
- エイリアス先: (先程メモした VPCエンドポイントのDNS名)
作成後のホストゾーンは以下のような構成かと思います。赤枠が追加したエイリアスレコードです。
手順3. プライベートホストゾーンの関連付け
作成したプライベートホストゾーンを他アカウント( User Account#1
) へ共有します。
この作業は AWS CLI(もしくは SDK)しか対応していません。AWS CLIの手順を説明します。
※実行時の AWS CLIバージョン … 2.0.29
ホストゾーンIDの取得
aws route53 list-hosted-zones
コマンドで確認します。
Id
部分をメモしましょう。
ホストゾーンの「関連付けの承認」作成
aws route53 create-vpc-association-authorization
コマンドで関連付けの承認を行います。
コマンドの --vpc
には 関連付け先のVPC ID を入力します。
aws route53 create-vpc-association-authorization\ --hosted-zone-id (先程メモしたホストゾーンID)\ --vpc VPCRegion=ap-northeast-1,VPCId=(関連付け先のVPC ID)
ホストゾーンの「関連付け」作成
aws route53 associate-vpc-with-hosted-zone
コマンドで関連付けを行います。
これは 共有先のアカウント(User Account#1)で実行します 。
aws route53 associate-vpc-with-hosted-zone\ --hosted-zone-id (先程メモしたホストゾーンID)\ --vpc VPCRegion=ap-northeast-1,VPCId=(関連付け先のVPC ID)
上図のように "ChangeInfo"
が返されます。
マルチアカウントへの適用
マルチアカウントで VPCエンドポイントを集約させる場合、 今までの関連付け作成のプロセスを同じように別のアカウントに対して実施していきます。
動作確認
今までの手順を ssm, ec2messages, ssmmessages
の3つ(Session Managerに必要なエンドポイント)分実施しました。
User Account#1
のインスタンスに Session Manager 接続してみます。
Session Manager で確認
Session Manager にてターゲットインスタンスに表示がありました。 (インスタンスはプライベートサブネット上にあるので、この時点で意図通りの構成になっていること確認できます)
接続してみます。 各エンドポイントの名前解決を行います。
それぞれ DNS名に対する Address
が ローカルIP
(共通サービスにあるVPCエンドポイント)を指していることが分かりました。
aws route53 list-hosted-zones-by-vpc
で確認
最近のアップデートでVPCに関連付けられたプライベートホストゾーンを一覧表示出来るようになっています。
以下コマンドを実行して確認しました。
aws route53 list-hosted-zones-by-vpc\ --vpc-id (関連付け先のVPC ID) --vpc-region ap-northeast-1
それぞれ 3つのホストゾーンが共有されていること、確認できました。
おわりに
マルチアカウントのVPCエンドポイント集約の検証をしてみました。 アカウントそれぞれに同じVPCエンドポイントを置くと、結構料金がかかります。
CLIによるプライベートホストゾーン関連付け作業が必要ですが、コスト削減のためにも検討してみると良いと思います。
なお、このアーキテクチャは re:Invent 2019のネットワークセッションでも紹介されています。
以下そのセッションのレポートです。ご参考ください。
少しでもどなたかのお役に立てば幸いです。